css 文件打包
每个组件引用的css都是 css/index.scss 的路径,所以子组件展平放在src目录下,不能嵌套。
打包流程里,需要 rollup-plugin-copy 等插件:
plugins.push(
staticImport({
include: ['src/**/css/css.mjs'],
}),
ignoreImport({
include: ['**/*.scss', '**/*.css'],
body: 'import "./css/css.mjs";',
}),
copy({
targets: [
{
src: 'src/**/css/index.js',
dest: 'es',
rename: (name, extension, fullPath) => {
const result = `${fullPath.substring(4, fullPath.length - 8)}css.mjs`;
return result;
},
transform(contents, name) {
return contents.toString().replace('index.scss', 'index.css');
},
},
],
verbose: true,
}),
// 一些不需要 css 的组件,强行注入一个空文件
copy({
targets: [
{
src: 'script/utils/rollup-empty-input.css',
dest: [
'es/press-overlay/css',
],
rename: 'index.css',
},
],
verbose: true,
}),
);
如果公共的组件被打包到公共 chunk
中,css
文件会找不到。因为它被注入的也是 import "./css/css.mjs
,而 chunk
目录没有 css/css.mjs
,导致使用报错。解决办法是,利用 chunkFileNames
,根据 module
名称,改变存放路径。
const config = {
output: {
chunkFileNames(chunkInfo) {
const moduleIds = Object.keys(chunkInfo.modules);
const reg = /\/(press-[\w-]+)\.vue$/;
const vueFile = moduleIds.find(item => reg.test(item));
if (vueFile) {
const match = vueFile.match(reg);
return `${match[1]}/dep-[hash].js`;
}
return '_chunks/dep-[hash].js';
},
},
}